home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 38
/
Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso
/
-seriously_amiga-
/
misc
/
felix
/
source
/
startup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-01-25
|
4KB
|
207 lines
//*************************************************************************//
// Filename: StartUp.c
// Autor: Christian Taulien of Strange Intelligence
// Purpose: Library startup-code and function table definition
// Creation: 18. März 1998
//*************************************************************************//
#include "global.h"
#include "FelixBase.h"
#include "processcomm.h"
#include "funcs.h"
#include "flxclasses.h"
#include "freshlocale.h"
//*/ // Für GoldED 5 aktivieren
#include "golded:developer/api/include/apilib.h"
/*/ // Für GoldED 4 aktivieren
#include "golded:developer/api/include/api.h"
//*/
#include <exec/exec.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
extern "C" void CleanupModules();
extern "C" void InitModules();
extern ULONG SAVEDS L_OpenLibs(void);
extern void SAVEDS L_CloseLibs(void);
struct FelixBase *SAVEDS InitLib(register __a6 struct ExecBase *sysbase,
register __a0 APTR *seglist,
register __d0 struct FelixBase *exb);
struct FelixBase *SAVEDS OpenLib(register __a6 struct FelixBase *FelixBase);
APTR SAVEDS CloseLib(register __a6 struct FelixBase *FelixBase);
APTR SAVEDS ExpungeLib(register __a6 struct FelixBase *exb);
ULONG ExtFuncLib(void);
APTR glob_SegList = NULL;
LONG LibStart(void)
/*S*/
{
return(-1);
}
/*E*/
void _abort__STANDARD()
/*S*/
{
}
/*E*/
void exit(void)
/*S*/
{
CleanupModules();
}
/*E*/
extern APTR FuncTab [];
extern struct MyDataInit DataTab;
struct InitTable /* do not change! */
{
ULONG LibBaseSize;
APTR *FunctionTable;
struct MyDataInit *DataTable;
APTR InitLibTable;
} InitTab =
{
sizeof(struct FelixBase),
&FuncTab[0],
&DataTab,
InitLib
};
APTR FuncTab [] =
{
OpenLib,
CloseLib,
ExpungeLib,
ExtFuncLib,
APIMountClient,
APICloseClient,
APIBriefClient,
APIFree,
(APTR) ((LONG)-1)
};
extern struct FelixBase *FelixBase;
FLXWatchListC *glob_poWatches = NULL;
struct FelixBase * SAVEDS InitLib( register __a6 struct ExecBase *sysbase,
register __a0 APTR *seglist,
register __d0 struct FelixBase *apib)
/*S*/
{
InitModules();
TRACE("");
FelixBase = apib;
glob_SegList = seglist;
if (L_OpenLibs())
{
glob_sReturnBuffer = new char [1000];
glob_poCatalog = new CatalogC("felix.catalog", 1);
((struct FelixBase *)FelixBase)->api_Magic = API_MAGIC;
glob_poWatches = new FLXWatchListC;
StarteProzess();
return(FelixBase);
}
L_CloseLibs();
return NULL;
}
/*E*/
struct FelixBase * SAVEDS OpenLib(register __a6 struct FelixBase *FelixBase)
/*S*/
{
TRACE("");
FelixBase->api_LibNode.lib_OpenCnt++;
FelixBase->api_LibNode.lib_Flags &= ~LIBF_DELEXP;
return FelixBase;
}
/*E*/
APTR SAVEDS CloseLib(register __a6 struct FelixBase *FelixBase)
/*S*/
{
TRACE("");
FelixBase->api_LibNode.lib_OpenCnt--;
if (!FelixBase->api_LibNode.lib_OpenCnt)
{
if (FelixBase->api_LibNode.lib_Flags & LIBF_DELEXP)
{
return ExpungeLib(FelixBase);
} // if
} // if
return NULL;
}
/*E*/
APTR SAVEDS ExpungeLib(register __a6 struct FelixBase *api)
/*S*/
{
TRACE("");
struct FelixBase *FelixBase = api;
APTR seglist;
if (!FelixBase->api_LibNode.lib_OpenCnt)
{
ULONG negsize, possize, fullsize;
UBYTE *negptr = (UBYTE *) FelixBase;
seglist = glob_SegList;
if (glob_sReturnBuffer)
{
delete glob_sReturnBuffer;
glob_sReturnBuffer = NULL;
} // if
if (glob_poWatches)
{
delete glob_poWatches;
glob_poWatches = NULL;
} // if
BeendeProzess();
Remove((struct Node *)FelixBase);
if (glob_poCatalog)
{
delete glob_poCatalog;
glob_poCatalog = NULL;
} // if
L_CloseLibs();
negsize = FelixBase->api_LibNode.lib_NegSize;
possize = FelixBase->api_LibNode.lib_PosSize;
fullsize = negsize + possize;
negptr -= negsize;
FreeMem(negptr, fullsize);
CleanupModules();
return seglist;
}
FelixBase->api_LibNode.lib_Flags |= LIBF_DELEXP;
return NULL;
}
/*E*/
ULONG ExtFuncLib(void)
/*S*/
{
return NULL;
}
/*E*/
struct FelixBase *FelixBase = NULL;